﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WebProjectOrder.WebServices;

namespace WebProjectOrder.WebServices
{
    public class AuxiliarAccount
    {

        #region Atributos de la clase Cuenta Auxiliar
        private int _AccountID;
        private String _Name;
        private String _OwnerName;
        private String _AccountCode;
        private Constants.AuxiliarAccountType _AccountType;
        private Constants.AuxiliarEntryType _EntryType;
        private Currency _Currency;
        private Double _Amount;
        private Double _LimitedCreditAmount;
        private int _Parent;
        private String _PayCondition;
        private bool _AlDebe;
        private String _Contrasena;
        #endregion

        #region Properties
        public Constants.AuxiliarAccountType AccountType
        {
            get { return _AccountType; }
            set { _AccountType = value; }
        }

        /// <summary>
        /// Es el nombre con el que la cuenta se despliega en la interfaz (Código + Nombre)
        /// </summary>
        public String DisplayName
        {
            get { return _AccountCode + " " + _Name; }
        }

        /// <summary>
        /// Retorna el ID de la cuenta
        /// </summary>
        public int AccountID
        {
            get { return _AccountID; }
            set { _AccountID = value; }
        }

        /// <summary>
        /// Retorna y Setea el nombre de la cuenta
        /// </summary>
        public String Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        /// <summary>
        /// Retrona y setea el nombre extranjero de la cuenta
        /// </summary>
        public String OwnerName
        {
            get { return _OwnerName; }
            set { _OwnerName = value; }
        }

        /// <summary>
        /// Retorna el código de la cuenta
        /// </summary>
        public String AccountCode
        {
            get { return _AccountCode; }
            set { _AccountCode = value; }
        }

        /// <summary>
        /// Retorna y setea el tipo de cuenta que es
        /// </summary>
        public Constants.AuxiliarEntryType EntryType
        {
            get { return _EntryType; }
            set { _EntryType = value; }
        }

        // Retorna y setea la moneda
        public Currency AccountCurrency
        {
            get { return _Currency; }
            set { _Currency = value; }
        }

        public int Parent
        {
            get { return _Parent; }
            set { _Parent = value; }
        }

        /// <summary>
        /// Monto correspondiente al saldo de la cuenta
        /// </summary>
        public double Amount
        {
            get { return _Amount; }
            set { _Amount = value; }
        }

        /// <summary>
        /// Monto correspondiente el monto de límite de crédito para el cliente
        /// </summary>
        public double LimitedCreditAmount
        {
            get { return _LimitedCreditAmount; }
            set { _LimitedCreditAmount = value; }
        }

        /// <summary>
        /// Método que se encarga de retornar o setear el tipo de condición de pago para la cuenta
        /// </summary>
        public String PayCondition
        {
            get { return _PayCondition; }
            set { _PayCondition = value; }
        }

        public bool AlDebe
        {
            get { return _AlDebe; }
            set { _AlDebe = value; }
        }

        /// <summary>
        /// Método que se encarga de retornar la contraseña del Usuario
        /// </summary>
        public String Contrasena
        {
            get { return _Contrasena; }
            set { _Contrasena = value; }
        }
        #endregion

        /// <summary>
        /// Actualiza el saldo de la cuenta auxiliar con un tipo de incremento. Es decir que el saldo aumenta o disminuye dependiendo
        /// del tipo de incremento que se pasa de parámetro.
        /// </summary>
        /// <param name="amount">Monto en el que se altera el saldo de la cuenta</param>
        /// <param name="incrementType">Tipo de incremento que va a tener la cuenta auxiliar</param>
        public void AddAmount(double amount, Constants.AccountingEntryType incrementType)
        {
            _Amount += amount * (_AlDebe ^ (incrementType == Constants.AccountingEntryType.debit) ? -1 : 1);
            if (_Amount < 0)
            {
                _Amount *= -1;
                _AlDebe = !_AlDebe;
            }
        }
    }
}
